package jmine.tec.hydra.domain.actions;

import java.util.Collections;
import java.util.List;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

import jmine.tec.hydra.api.HydraAction;
import jmine.tec.hydra.api.HydraMessage;
import jmine.tec.hydra.api.SendMessageAction;
import jmine.tec.hydra.send.Sender;
import jmine.tec.persist.annotation.DiscriminatorComment;

/**
 * Action responsável por enviar uma mensagem de acordo com uma especificação.
 * 
 * @author lundberg
 */
@Entity
@DiscriminatorValue("6")
@DiscriminatorComment("ENVIO DE MENSAGEM")
public class DefaultSendMessageAction extends AbstractHydraAction implements SendMessageAction {

    // Transient
    private HydraMessage message;

    /**
     * {@inheritDoc}
     */
    public SendMessageAction prepare(HydraMessage msg) {
        this.message = msg;
        return this;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected List<HydraAction> doExecute() throws Exception {
        Sender sender = this.getRequest().getSpecification().getSender();
        sender.send(this.message);
        LOGGER.debug(String.format("Mensagem enviada (id=%s).", this.message.getId()));
        this.logAsSystem(String.format("Mensagem enviada ao sistema %s", this.message.getSystem().getMnemonico()));
        return Collections.emptyList();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected String createDescription() {
        return "Envio de mensagem";
    }
}
